/**
 * 改自
 * 版权声明：本文为CSDN博主「Jermyo」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
 * 原文链接：https://blog.csdn.net/Jermyo/article/details/117130180
 */

class GradientColor{
    /**
     * @param {String} startColor 开始颜色hex
     * @param {String} endColor 开始颜色hex
     * @param {Number} step 分为几个阶级
     * */
    static gradientColor(startColor,endColor,step){
        var startRGB = this.colorRgb(startColor);//转换为rgb数组模式
        
        var startR = startRGB[0];
        var startG = startRGB[1];
        var startB = startRGB[2];

        var endRGB = this.colorRgb(endColor);

        var endR = endRGB[0];
        var endG = endRGB[1];
        var endB = endRGB[2];

        var sR = (endR-startR)/step;//总差值
        var sG = (endG-startG)/step;
        var sB = (endB-startB)/step;
    
        var colorArr = [];
        for(var i=0;i<=step;i++){
            //计算每一步的hex值 
            var hex = this.colorHex('rgb('+parseInt((sR*i+startR))+','+parseInt((sG*i+startG))+','+parseInt((sB*i+startB))+')');
            colorArr.push(hex);
        }

        return colorArr;
    }
    
    /**
     * 将hex表示方式转换为rgb表示方式(这里返回rgb数组模式)
     * @param {String} sColor
     */
    static colorRgb(sColor){
        var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/;
        var sColor = sColor.toLowerCase();
        if(sColor && reg.test(sColor)){
            if(sColor.length === 4){
                var sColorNew = "#";
                for(var i=1; i<5; i+=1){
                    sColorNew += sColor.slice(i,i+1).concat(sColor.slice(i,i+1));
                }
                sColor = sColorNew;
            }
            //处理六位的颜色值
            var sColorChange = [];
            for(var i=1; i<9; i+=2){
                sColorChange.push(parseInt("0x"+sColor.slice(i,i+2)));
            }
            const [r, g, b, a] = sColorChange
            return [r, g, b,  parseFloat(((a || 255) /255).toFixed(2))];
            
            
        // rgb a
        }else if(/^(rgb|rgba)/.test(sColor)){
            return this.rgbaTransRgba(sColor);
        }else {
            return null
        }
    };
    
    // 将rgb表示方式转换为hex表示方式
    // https://www.jianshu.com/p/a7e9113d6992
    static colorHex(color){
        var _this = color.toLowerCase();
        var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/;
        if(/^(rgb|RGB)/.test(_this)){
            var [r, g, b, a] = this.rgbaTransRgba(_this)
            // console.log(a, r, g, b)
            return '#' + this.rgbaTransHex(r) + this.rgbaTransHex(g) + this.rgbaTransHex(b)
        }else if(reg.test(_this)){
            var aNum = _this.replace(/#/,"").split("");
            if(aNum.length === 6){
                return _this;
            }else if(aNum.length === 3){
                var numHex = "#";
                for(var i=0; i<aNum.length; i+=1){
                    numHex += (aNum[i]+aNum[i]);
                }
                return numHex;
            }
        }else{
            return _this;
        }
   }
   static rgbaTransHex(x) {
       return ("0" + parseInt(x).toString(16)).slice(-2);
   }
   /**
    * 解析rgba
    */
   static rgbaTransRgba(rgba){
        var values = rgba
               .replace(/rgba?\(/, '')
               .replace(/\)/, '')
               .replace(/[\s+]/g, '')
               .split(',')
        var a = parseFloat(values[3] || 1)
        var r,
        g,
        b;
        r = Math.floor(parseInt(values[0]) + (1 - a) * 255),
        g = Math.floor(parseInt(values[1]) + (1 - a) * 255),
        b = Math.floor(parseInt(values[2]) + (1 - a) * 255)
       return [r, g, b, a]
   }
}

export default GradientColor